<?php
/**
 * 权限安装类
 * 安装方法：dpAuthInstall::install();
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpAuthInstall.php 5 2012-04-22 14:41:54Z Mo.yi $
 * @package db
 * @since 1.0
 */

class dpAuthInstall
{

	public static function install()
	{
		$act = empty($_GET['act']) ? '' : $_GET['act'];

		if (!self::copyResources())
			dpException::error('移动文件失败，请手动设置应用程序runtime目录可写');

		if($act == 'install')
			self::run();

		self::render();
	}

	public static function copyResources()
	{
		$basePath = DP_PATH . DS . 'web' . DS . 'auth' . DS . 'views' . DS;
		$appPath = APP_PATH . DS . 'runtime' . DS . 'install';
		$dirs     = array(
			'css',
			'js',
			'images',
		);
		
		if (is_dir($appPath))
			return true;
		else
			@mkdir($appPath , 0777, true);
		
		foreach ($dirs as $dir) {
			is_dir($appPath . DS . $dir) or @mkdir($appPath . DS . $dir , 0777, true);
			$rs = opendir($basePath . $dir);
			while ($file = readdir($rs)) {
				$appDir = APP_PATH . DS . 'runtime' . DS . 'install' . DS . $dir . DS;
				if ($file == '.' or $file =='..') continue;
				$currentFile = $basePath . $dir . DS . $file;
				if (is_file($currentFile)) @copy($currentFile, $appDir . $file);
			}
		}
		return true;
	}

	/**
	 * 执行权限安装方法
	 * @param string $link 连接类型从库名字，默认安装到主库
	 * @return boolean 安装成功返回 true
	 */
	public static function run($link = '')
	{
		$db	    = D::app()->db($link)->createSql();
		$info   = $db->getCurrentDbInfo();
		$driver = $info['driver'];
		$other  = '';
		if($driver == 'pdo:mysql' || $driver == 'mysql' || $driver == 'mysqli')
		{
			$other = 'CHARSET=' . $info['charset'];
		}
		/**
		 * 所有数据表的表名
		 * user:		用户表
		 * group: 		组表
		 * role:		角色表
		 * behavior:	行为表
		 */
		$tables   = array(

			'user',

			'user_role',

			'group',

			'group_role',

			'role',

			'behavior',

		);

		/**
		 * 所有数据表的架构
		 * 一个用户只能有一个组别，用户跟组是一对多关系
		 * 一个用户可以有多个角色，用户跟角色是一对多关系
		 * 一个组别可以有多个角色，用户组跟角色是一对多关系
		 * 一个用户的组相同，代表他们权限也相同。
		 * 一个角色有多种行为，角色跟行为是多对多关系
		 * 角色表为无限级设计，即角色有子角色，可以一直无限延伸下去。
		 * 父角色有它下面所有子角色的行为权限，子角色只有它当前行为权限，不可跨级和继承父角色。
		 * 如果子角色下面还有子角色，那么这个子角色跟父角色同理，拥有它下面子角色的所有行为权限（只一级）。
		 * 一个行为可以设置访问的模块，控制器，动作(module,controller,action)
		 * 如果是超级管理员，则不受任何权限控制。
		 */
		$schemas = array(

			//用户身份表，开发者可自行扩展用户表
			'user' => array(
				'uid' => 'pk',								//用户id
				'gid' => 'int_not',							//组id
				'is_manage' => 'bool_not',					//是否超级管理员 1为超级管理员，默认为空
				'is_activation' => 'bool_not',				//是否激活用户   1为用户已激活，默认为空
				'is_extends' => 'bool_not',					//是否允许用户角色继承 1为允许，默认为空
				'username' => 'varchar(30) NOT NULL',		//用户名
				'password' => 'varchar(32) NOT NULL',		//MD5后的密码
			),

			//用户角色表
			'user_role' => array(
				'user_rid' => 'pk',							//用户角色ID
				'uid'	   => 'integer',					//用户ID
				'rid'	   => 'integer',					//角色ID
			),

			//组表
			'group' => array(
				'gid' => 'pk',								//组id
				'is_group_enabled' => 'bool_not',			//是否启用组   1为已启用，默认为空
				'group_name' => 'varchar(60) NOT NULL',		//组名
				'is_extends'  => 'bool_not',				//是否允许组角色继承 1为允许，默认为空
				'description' => 'string',					//描述
			),

			//组角色表
			'group_role' => array(
				'group_rid' => 'pk',						//组角色ID
				'gid'		=> 'integer',					//组ID
				'rid'		=> 'integer',					//角色ID
			),

			//角色表
			'role' => array(
				'rid' => 'pk',								//角色id
				'father_role_id' => 'int_not',				//父角色ID，默认为
				'role_name' => 'varchar(60) NOT NULL',		//角色名称
				'is_role_enabled' => 'bool_not',			//是否启用角色 1为启用，默认为空
				'description'  => 'string',					//描述
			), 

			//行为表
			'behavior' => array(
				'bid' => 'pk',								//行为id
				'rid' => 'integer',							//角色id
				'behavior_name'  => 'varchar(30) NOT NULL',	//行为名
				'access_module'  => 'string',				//行为可访问的模块
				'access_control' => 'string',				//行为可访问的控制器
				'access_action'  => 'text',					//行文可访问的动作
			),

		);

		foreach ($tables as $name) {
			$db->dropTable('{'.$name.'}');
			$db->createTable('{'.$name.'}', $schemas[$name], $other);
		}

		return true;

	}

	public static function render()
	{
		include 'views/index.html';
	}
}
?>